import json

import allure
from jsonpath import jsonpath
from loguru import logger
from tools.hande_replace import replace_mark
@allure.step("响应断言")
def response_assert(response,expected_data):
    logger.info("=======================开始进行响应断言======================")
    # 因为有些表格没有加断言表达式，所以我们进行字段的判空： 如果是空的，直接让函数结束即可，return代表函数结束
    if expected_data is None:
        logger.info("这条用例不需要做响应断言")
        return  # 函数结束 后面代码都不会执行了
    expected_data = replace_mark(expected_data)
    expected_data = json.loads(expected_data)
    logger.info(f"期望结果表达式是：{expected_data}")
    for k,v in expected_data.items():
        if k== "text":
            actual_result = response.text
            logger.info(f"执行结果是：{actual_result}")
            logger.info(f"预期结果是：{v}")
            try:
                assert actual_result == v
                logger.info("响应断言通过！")
            except AssertionError as e:
                logger.error(f"响应断言失败！")
                raise e
        elif k.startswith("$"):
            actual_result = jsonpath(response.json(),k)[0]
            logger.info(f"执行结果是：{actual_result}")
            logger.info(f"预期结果是：{v}")
            try:
                assert actual_result == v
                logger.info("响应断言通过！")
            except AssertionError as e:
                logger.error(f"响应断言失败！")
                raise e
